 1.RowKey的基本介绍
   
   ASCII码字典顺序。
   012,0,123,234,3.
   0,3,012,123,234
   0,012,123,234,3
   字典序的排序规则。
   先比较第一个字节，如果相同，然后比对第二个字节，以此类推，
   如果到第X个字节，其中一个已经超出了rowkey的长度，短rowkey排在前面。
   1).RowKey长度原则
   rowkey是一个二进制码流，可以是任意字符串，最大长度64kb，实际应用中一般为10-100 bytes,
以byte[]形式保存，一般设计成定长。
   建议越短越好，不要超过16个字节:
       设计过长会降低memstore内存的利用率和HFile存储数据的效率。
   2).RowKey散列原则
   建议将rowkey的高位作为散列字段，这样将提高数据均衡分布在每个RegionServer，以实现负载均
衡的几率。
   3).RowKey唯一原则
   必须在设计上保证其唯一性，
   访问hbase table中的行：有3种方式：
   (1).单个rowkey
   (2).rowkey 的range
   (3).全表扫描(一定要避免全表扫描)
   实现方式：
   (1).org.apache.hadoop.hbase.client.Get
   (2).scan方法： org.apache.hadoop.hbase.client.Scan
   scan使用的时候注意：
   setStartRow，setEndRow 限定范围， 范围越小，性能越高。
   4).RowKey排序原则
   HBase的Rowkey是按照ASCII有序设计的，我们在设计Rowkey时要充分利用这点.
 
 2.HBase表的热点
   
   1).什么是热点
   检索habse的记录首先要通过row key来定位数据行。当大量的client访问hbase集群的一个或少数几
个节点，造成少数region server的读/写请求过多、负载过大，而其他region server负载却很小，就造
成了“热点”现象
   2).热点的解决方案
    (1).预分区
	预分区的目的让表的数据可以均衡的分散在集群中，而不是默认只有一个region分布在集群的一
个节点上。
	(2).加盐
	这里所说的加盐不是密码学中的加盐，而是在rowkey的前面增加随机数，具体就是给rowkey分配
一个随机前缀以使得它和之前的rowkey的开头不同。
    4个region,[,a),[a,b),[b,c),[c,]
	原始数据：abc1,abc2,abc3.
    加盐后的rowkey：a-abc1,b-abc2,c-abc3
	   abc1,a
       abc2,b
	(3).哈希
	哈希会使同一行永远用一个前缀加盐。哈希也可以使负载分散到整个集群，但是读却是可以预测
的。使用确定的哈希可以让客户端重构完整的rowkey，可以使用get操作准确获取某一个行数据。
    原始数据： abc1，abc2,abc3
	哈希：
    md5（abc1）=92231 b....., 9223-abc1
    md5(abc2) =32a131122...., 32a1-abc2
    md5(abc3) = 452b1...., 452b-abc3.
	(4).反转
	反转固定长度或者数字格式的rowkey。这样可以使得rowkey中经常改变的部分（最没有意义的部
分）放在前面。这样可以有效的随机rowkey，但是牺牲了rowkey的有序性。
    15X,13X,
 
 3.HBase的二级索引
   
   HBase表按照rowkey查询性能是最高的。rowkey就相当于hbase表的一级索引！！
   为了HBase的数据查询更高效、适应更多的场景，诸如使用非rowkey字段检索也能做到秒级响
应，或者支持各个字段进行模糊查询和多字段组合查询等， 因此需要在HBase上面构建二级索引， 以
满足现实中更复杂多样的业务需求。
   hbase的二级索引其本质就是建立hbase表中列与行键之间的映射关系。
   常见的二级索引我们一般可以借助各种其他的方式来实现，例如Phoenix或者solr或者ES等
 
 4.布隆过滤器在hbase的应用
   
   1).布隆过滤器应用
   之前再讲hbase的数据存储原理的时候，我们知道hbase的读操作需要访问大量的文件，大部分的
实现通过布隆过滤器来避免大量的读文件操作。
   2).布隆过滤器的原理
   通常判断某个元素是否存在用的可以选择hashmap。但是 HashMap 的实现也有缺点，例如存储
容量占比高，考虑到负载因子的存在，通常空间是不能被用满的，而一旦你的值很多例如上亿的时候，
那 HashMap 占据的内存大小就变得很可观了。
   Bloom Filter是一种空间效率很高的随机数据结构，它利用位数组很简洁地表示一个集合，并能判
断一个元素是否属于这个集合。
   hbase 中布隆过滤器来过滤指定的rowkey是否在目标文件，避免扫描多个文件。使用布隆过滤器来判
断。
   布隆过滤器返回true,在结果不一定正确，、如果返回false则说明确实不存在。
   3).原理示意图
   4).Bloom Filter案例
   布隆过滤器，已经不需要自己实现，Google已经提供了非常成熟的实现。
   <dependency>
       <groupId>com.google.guava</groupId>
       <artifactId>guava</artifactId>
       <version>27.0.1-jre</version>
   </dependency>
   使用
   guava 的布隆过滤器，封装的非常好，使用起来非常简洁方便。
   例： 预估数据量1w，错误率需要减小到万分之一。使用如下代码进行创建。